AWS Step Functions:Activity State MachineでLambda以外のアプリケーションを実行してみた
こんにちは、菊池です。本年1つ目のブログです。
AWS re:Invent 2016で発表されたAWS Step Functionsは、複数のLambdaアプリケーションを連携して実行させるのに非常に便利ですが、Lambda以外にもEC2やオンプレミス環境で実行されるアプリケーションもState Machineに組み込んで実行させることが可能です。
Activity State Machine
State MachineのTask Stateで実行するアプリケーションには、Lambda関数だけでなく、Activityを指定可能です。このActivityを利用することでEC2やオンプレミスのアプリケーションを実行することが可能になります。
以下の手順でActivity State Machineを作成し実行してみます。
- Activityの作成
- State Machineの作成
- State Machineの実行
1. Activityの作成
まずはActivityを作成します。
指定するパラメータはActivity Nameのみで作成できます。
作成すると、ActivityのARNが生成されます。
2. State Machineの作成
続いてState Machineの作成です。チュートリアルに従って以下のようなState Machineを作成します。
{ "Comment": "An example using a Task state.", "StartAt": "getGreeting", "Version": "1.0", "TimeoutSeconds": 300, "States": { "getGreeting": { "Type": "Task", "Resource": "arn:aws:states:ap-northeast-1:xxxxxxxxxxxx:activity:test", "End": true } } }
Activityを実行するTaskが1つあるだけのシンプルなState Machineです。
3. State Machineの実行
この状態で実行しても、実行されるアプリケーションがありません。Taskで指定したActivityと連携するアプリケーションが必要です。
Lambdaの場合には、State MachineがTaskで指定したLambda関数にトリガーしてアプリケーションを起動するPush型の実行になります。一方で、Activityの場合にはアプリケーション側でActivityをポーリングするPull型の実行となります。
動作イメージ
EC2で動作するアプリケーションの場合、実行イメージは以下のようになります。
- EC2からActivityをポーリング(Get-Activity-Task)
- State Machineを実行
- Activityを指定したTask Stateに到達すると、TaskTokenを応答する
- アプリケーションの処理を実行
- 実行結果をTaskTokenとともにState Machineに通知(Send-Task-Success)
Activityで実行したいアプリケーションでは、Taskへの到達をポーリングし、処理の結果を通知するように実装する必要があります。
今回はシンプルに以下のようなPythonコードを実行してテストしました。
import boto3 client = boto3.client('stepfunctions') response = client.get_activity_task( activityArn = "arn:aws:states:ap-northeast-1:xxxxxxxxxxxx:activity:test", workerName = "testWorker" ) Token = str(response['taskToken']) Result = str(response['input']) result = client.send_task_success( taskToken = Token, output = Result )
get-activity-task
を実行し、応答があればTaskTokenとInputをそのままsend_task_success
で通知します。
実行してみる
アプリケーションとState Machineを実行してみます。アプリケーションを先に実行すると、State Machineが実行され応答が来るのを待ちます(60秒でタイムアウト)。State Machineを先に実行すれば、Task Stateで指定した300秒間はアプリケーションが実行されるのを待ちます。
両者を実行することで以下のように実行結果が得られました。
まとめ
Step FunctionsはLambdaを連携させるサービスというイメージがありますが、Activityを使うことでEC2やオンプレ環境のアプリケーションも連携させることが可能ということがわかりました。
データソースや実行環境・言語などの都合でLambdaで実行できないアプリケーションでも、フローを作成して複雑な連携や実行状態の管理が可能になる、幅広く応用できるサービスです。